# load required libraries
library(tidyverse)
[37m── [1mAttaching packages[22m ──────────────────────────────────────── tidyverse 1.2.1 ──[39m
[37m[32m✔[37m [34mggplot2[37m 3.0.0 [32m✔[37m [34mpurrr [37m 0.2.5
[32m✔[37m [34mtibble [37m 1.4.2 [32m✔[37m [34mdplyr [37m 0.7.6
[32m✔[37m [34mtidyr [37m 0.8.1 [32m✔[37m [34mstringr[37m 1.3.1
[32m✔[37m [34mreadr [37m 1.1.1 [32m✔[37m [34mforcats[37m 0.3.0[39m
[37m── [1mConflicts[22m ─────────────────────────────────────────── tidyverse_conflicts() ──
[31m✖[37m [34mdplyr[37m::[32mfilter()[37m masks [34mstats[37m::filter()
[31m✖[37m [34mdplyr[37m::[32mlag()[37m masks [34mstats[37m::lag()[39m
library(langcog) # source: https://github.com/langcog/langcog-package
Attaching package: ‘langcog’
The following object is masked from ‘package:base’:
scale
library(psych)
Attaching package: ‘psych’
The following objects are masked from ‘package:ggplot2’:
%+%, alpha
library(lme4)
Loading required package: Matrix
Attaching package: ‘Matrix’
The following object is masked from ‘package:tidyr’:
expand
library(cowplot)
Attaching package: ‘cowplot’
The following object is masked from ‘package:ggplot2’:
ggsave
# set theme for ggplots
theme_set(theme_bw())
Data preparation
d_all <- # d_us_ad_pilot %>% rownames_to_column("subid") %>%
d_gh_ad %>% rownames_to_column("subid") %>%
full_join(d_gh_ch %>% rownames_to_column("subid")) %>%
full_join(d_th_ad %>% rownames_to_column("subid")) %>%
full_join(d_th_ch %>% rownames_to_column("subid")) %>%
full_join(d_vt_ad %>% rownames_to_column("subid")) %>%
full_join(d_vt_ch %>% rownames_to_column("subid")) %>%
column_to_rownames("subid")
Joining, by = c("subid", "choose what to do", "feel guilty", "feel happy", "feel love", "feel pain", "feel proud", "feel sad", "feel scared", "feel shy", "feel sick, like when you feel like you might vomit", "feel tired", "figure out how to do things", "get angry", "get hungry", "get hurt feelings", "hear things", "pray", "remember things", "sense temperatures", "sense when things are far away", "smell things", "think about things")
Joining, by = c("subid", "choose what to do", "feel guilty", "feel happy", "feel love", "feel pain", "feel proud", "feel sad", "feel scared", "feel shy", "feel sick, like when you feel like you might vomit", "feel tired", "figure out how to do things", "get angry", "get hungry", "get hurt feelings", "hear things", "pray", "remember things", "sense temperatures", "sense when things are far away", "smell things", "think about things")
Joining, by = c("subid", "choose what to do", "feel guilty", "feel happy", "feel love", "feel pain", "feel proud", "feel sad", "feel scared", "feel shy", "feel sick, like when you feel like you might vomit", "feel tired", "figure out how to do things", "get angry", "get hungry", "get hurt feelings", "hear things", "pray", "remember things", "sense temperatures", "sense when things are far away", "smell things", "think about things")
Joining, by = c("subid", "choose what to do", "feel guilty", "feel happy", "feel love", "feel pain", "feel proud", "feel sad", "feel scared", "feel shy", "feel sick, like when you feel like you might vomit", "feel tired", "figure out how to do things", "get angry", "get hungry", "get hurt feelings", "hear things", "pray", "remember things", "sense temperatures", "sense when things are far away", "smell things", "think about things")
Joining, by = c("subid", "choose what to do", "feel guilty", "feel happy", "feel love", "feel pain", "feel proud", "feel sad", "feel scared", "feel shy", "feel sick, like when you feel like you might vomit", "feel tired", "figure out how to do things", "get angry", "get hungry", "get hurt feelings", "hear things", "pray", "remember things", "sense temperatures", "sense when things are far away", "smell things", "think about things")
Shared conceptual structure
Pooling all participants from all sites together into a common factor structure.
Parallel analysis
How many factors to retain?
reten_all_PA <- fa.parallel(d_all, plot = F); reten_all_PA
Parallel analysis suggests that the number of factors = 4 and the number of components = 2
Call: fa.parallel(x = d_all, plot = F)
Parallel analysis suggests that the number of factors = 4 and the number of components = 2
Eigen Values of
Original factors Simulated data Original components simulated data
1 8.94 0.35 9.52 1.27
2 1.46 0.25 2.08 1.23
3 0.50 0.21 1.11 1.20
4 0.25 0.18 0.86 1.17
reten_all_par <- reten_all_PA$nfact
What are these factors?
efa_all_par <- fa(d_all, nfactors = reten_all_par, rotate = "oblimin",
scores = "tenBerge", impute = "median")
Loading required namespace: GPArotation
heatmap_fun(efa_all_par) +
labs(title = "Parallel Analysis")
Joining, by = "capacity"
Joining, by = "factor"

Which capacities are attributed to which targets?
scoresplot_fun(efa_all_par, target = "all") +
labs(title = "Parallel Analysis")
|====================================== | 70% ~1 s remaining
|======================================== | 73% ~1 s remaining
|========================================= | 76% ~1 s remaining
|=========================================== | 78% ~1 s remaining
|============================================ | 82% ~0 s remaining
|============================================== | 85% ~0 s remaining
|================================================ | 89% ~0 s remaining
|================================================== | 92% ~0 s remaining
|==================================================== | 95% ~0 s remaining
|====================================================== | 99% ~0 s remaining
Ignoring unknown aesthetics: y

scoresplot_fun(efa_all_par, target = c("ghosts", "God", "children")) +
labs(title = "Parallel Analysis")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_par, target = c("ghosts", "God", "children")) +
labs(title = "Parallel Analysis")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"
|============================= | 53% ~2 s remaining
|============================== | 55% ~2 s remaining
|=============================== | 57% ~2 s remaining
|================================ | 59% ~2 s remaining
|================================= | 60% ~1 s remaining
|================================== | 62% ~1 s remaining
|================================== | 63% ~1 s remaining
|==================================== | 66% ~1 s remaining
|===================================== | 67% ~1 s remaining
|===================================== | 69% ~1 s remaining
|======================================= | 71% ~1 s remaining
|======================================= | 72% ~1 s remaining
|======================================== | 74% ~1 s remaining
|========================================= | 76% ~1 s remaining
|========================================== | 77% ~1 s remaining
|=========================================== | 79% ~1 s remaining
|=========================================== | 80% ~1 s remaining
|============================================ | 81% ~1 s remaining
|============================================= | 83% ~1 s remaining
|============================================== | 85% ~1 s remaining
|=============================================== | 87% ~0 s remaining
|================================================ | 89% ~0 s remaining
|================================================= | 91% ~0 s remaining
|=================================================== | 93% ~0 s remaining
|==================================================== | 95% ~0 s remaining
|===================================================== | 97% ~0 s remaining
|====================================================== | 99% ~0 s remaining
Joining, by = c("factor", "capacity", "order")

Minimizing BIC
How many factors to retain?
reten_all_BIC <- VSS(d_all, plot = F); reten_all_BIC
Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm,
n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.89 with 1 factors
VSS complexity 2 achieves a maximimum of 0.93 with 2 factors
The Velicer MAP achieves a minimum of 0.01 with 2 factors
BIC achieves a minimum of -613.26 with 4 factors
Sample Size adjusted BIC achieves a minimum of -157.21 with 5 factors
Statistics by number of factors
vss1 vss2 map dof chisq prob sqresid fit RMSEA BIC SABIC complex eChisq
1 0.89 0.00 0.022 209 2284 0.0e+00 10.9 0.89 0.104 855 1519 1.0 2775
2 0.57 0.93 0.010 188 874 7.3e-89 6.7 0.93 0.063 -412 185 1.5 580
3 0.45 0.82 0.011 168 550 4.5e-42 5.7 0.94 0.050 -599 -66 1.9 281
4 0.45 0.82 0.014 149 406 1.2e-25 5.2 0.95 0.043 -613 -140 2.0 178
5 0.42 0.74 0.018 131 323 3.4e-18 4.9 0.95 0.040 -573 -157 2.2 138
6 0.44 0.72 0.022 114 260 1.8e-13 4.6 0.95 0.038 -519 -157 2.3 103
7 0.41 0.71 0.028 98 212 2.2e-10 4.3 0.96 0.036 -458 -147 2.4 79
8 0.41 0.69 0.033 83 159 1.1e-06 4.1 0.96 0.032 -409 -145 2.5 56
SRMR eCRMS eBIC
1 0.080 0.084 1346
2 0.037 0.041 -706
3 0.026 0.030 -868
4 0.020 0.025 -841
5 0.018 0.024 -758
6 0.015 0.022 -677
7 0.014 0.021 -591
8 0.011 0.019 -512
reten_all_bic <- data.frame(reten_all_BIC$vss.stats %>% rownames_to_column("nfact") %>% top_n(-1, BIC))$nfact %>% as.numeric()
What are these factors?
efa_all_bic <- fa(d_all, nfactors = reten_all_bic, rotate = "oblimin",
scores = "tenBerge", impute = "median")
heatmap_fun(efa_all_bic,
factor_names = c("COGNITIVE", "BODILY", "SOCIAL-EMOTIONAL", "other")) +
# labs(title = "Minimizing BIC")
labs(x = "Figure 1: Shared conceptual structure") +
theme(axis.title.x = element_text(hjust = 0)) +
guides(fill = guide_colorbar("factor loading", barheight = 15))
the condition has length > 1 and only the first element will be usedJoining, by = "capacity"
Joining, by = "factor"

Which capacities are attributed to which targets?
scoresplot_fun(efa_all_bic, target = "all", highlight = "supernatural",
factor_names = c("COGNITIVE", "BODILY", "SOCIAL-EMOTIONAL", "other")) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 1,
color = c(rep("black", 8),
rep("#984ea3", 2)),
face = c(rep("plain", 8),
rep("bold", 2)))) +
scale_fill_manual(values = c("#e41a1c", "#4daf4a", "#377eb8", "gray")) +
# labs(title = "Minimizing BIC")
labs(title = "Figure 2: Factor scores")
the condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: yScale for 'fill' is already present. Adding another scale for 'fill', which
will replace the existing scale.

scoresplot_fun(efa_all_bic, target = c("ghosts", "God", "children")) +
# scale_fill_manual(values = c("#e41a1c", "#4daf4a", "#377eb8")) +
labs(title = "Minimizing BIC")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_bic, target = c("ghosts", "God", "children")) +
labs(title = "Minimizing BIC")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"
|============================================= | 83% ~0 s remaining
|============================================== | 85% ~0 s remaining
|=============================================== | 86% ~0 s remaining
|================================================ | 89% ~0 s remaining
|================================================= | 91% ~0 s remaining
|================================================== | 93% ~0 s remaining
|==================================================== | 95% ~0 s remaining
|===================================================== | 97% ~0 s remaining
|====================================================== | 99% ~0 s remaining
Joining, by = c("factor", "capacity", "order")

Preset criteria
How many factors to retain?
reten_all_k <- reten_fun(d_all, rot_type = "oblimin"); reten_all_k
[1] 2
What are these factors?
efa_all_k <- fa(d_all, nfactors = reten_all_k, rotate = "oblimin",
scores = "tenBerge", impute = "median")
heatmap_fun(efa_all_k) +
labs(title = "Preset criteria (Weisman et al., 2017)")
Joining, by = "capacity"
Joining, by = "factor"

Which capacities are attributed to which targets?
scoresplot_fun(efa_all_k, target = "all") +
labs(title = "Preset criteria (Weisman et al., 2017)")
Ignoring unknown aesthetics: y

scoresplot_fun(efa_all_k, target = c("ghosts", "God", "children")) +
labs(title = "Preset criteria (Weisman et al., 2017)")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_k, target = c("ghosts", "God", "children")) +
labs(title = "Preset criteria (Weisman et al., 2017)")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"
|========================================== | 78% ~1 s remaining
|=========================================== | 80% ~1 s remaining
|============================================ | 81% ~0 s remaining
|============================================= | 83% ~0 s remaining
|============================================= | 84% ~0 s remaining
|============================================== | 85% ~0 s remaining
|=============================================== | 87% ~0 s remaining
|================================================ | 89% ~0 s remaining
|================================================= | 90% ~0 s remaining
|================================================== | 92% ~0 s remaining
|=================================================== | 94% ~0 s remaining
|==================================================== | 95% ~0 s remaining
|===================================================== | 97% ~0 s remaining
|====================================================== | 99% ~0 s remaining
Joining, by = c("factor", "capacity", "order")

3 factors
What are these factors?
efa_all_3 <- fa(d_all, nfactors = 3, rotate = "oblimin",
scores = "tenBerge", impute = "median")
heatmap_fun(efa_all_3,
factor_names = c("COGNITIVE", "BODILY", "SOCIAL-EMOTIONAL")) +
labs(x = "Shared concpetual structure") +
theme(axis.title.x = element_text(hjust = 0))
the condition has length > 1 and only the first element will be usedJoining, by = "capacity"
Joining, by = "factor"

# labs(title = "Preset criteria (Weisman et al., 2017)")
Which capacities are attributed to which targets?
scoresplot_fun(efa_all_3, target = "all", highlight = "supernatural",
factor_names = c("COGNITIVE", "BODILY", "SOCIAL-EMOTIONAL")) +
scale_fill_manual(values = c("#e41a1c", "#4daf4a", "#377eb8")) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 1,
color = c(rep("black", 8),
rep("#984ea3", 2)),
face = c(rep("plain", 8),
rep("bold", 2))))
the condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: yScale for 'fill' is already present. Adding another scale for 'fill', which
will replace the existing scale.

scoresplot_fun(efa_all_3, target = c("ghosts", "God", "children")) +
labs(title = "Preset criteria (Weisman et al., 2017)")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_3, target = c("ghosts", "God", "children")) +
labs(title = "Preset criteria (Weisman et al., 2017)")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"
|======================================== | 74% ~1 s remaining
|========================================= | 76% ~1 s remaining
|=========================================== | 78% ~1 s remaining
|============================================ | 80% ~1 s remaining
|============================================= | 82% ~0 s remaining
|============================================== | 84% ~0 s remaining
|=============================================== | 86% ~0 s remaining
|================================================ | 88% ~0 s remaining
|================================================= | 90% ~0 s remaining
|================================================== | 92% ~0 s remaining
|=================================================== | 94% ~0 s remaining
|==================================================== | 96% ~0 s remaining
|====================================================== | 98% ~0 s remaining
Joining, by = c("factor", "capacity", "order")

Comparing conceptual structures
We’ll extract 4 factors from all samples, to keep things simple.
efa_us_ad_4 <- fa(d_us_ad_pilot, nfactors = 4, rotate = "oblimin")
efa_gh_ad_4 <- fa(d_gh_ad, nfactors = 4, rotate = "oblimin")
efa_gh_ch_4 <- fa(d_gh_ch, nfactors = 4, rotate = "oblimin")
efa_th_ad_4 <- fa(d_th_ad, nfactors = 4, rotate = "oblimin")
efa_th_ch_4 <- fa(d_th_ch, nfactors = 4, rotate = "oblimin")
efa_vt_ad_4 <- fa(d_vt_ad, nfactors = 4, rotate = "oblimin")
efa_vt_ch_4 <- fa(d_vt_ch, nfactors = 4, rotate = "oblimin")
plot_us_ad_4 <- heatmap_fun(efa_us_ad_4) +
guides(fill = "none") +
labs(x = "US: adults") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_gh_ad_4 <- heatmap_fun(efa_gh_ad_4) +
guides(fill = "none") +
labs(x = "Ghana: adults") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_gh_ch_4 <- heatmap_fun(efa_gh_ch_4) +
guides(fill = "none") +
labs(x = "Ghana: children") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_th_ad_4 <- heatmap_fun(efa_th_ad_4) +
guides(fill = "none") +
labs(x = "Thailand: adults") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_th_ch_4 <- heatmap_fun(efa_th_ch_4) +
guides(fill = "none") +
labs(x = "Thailand: children") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_vt_ad_4 <- heatmap_fun(efa_vt_ad_4) +
guides(fill = "none") +
labs(x = "Vanuatu: adults") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_vt_ch_4 <- heatmap_fun(efa_vt_ch_4) +
guides(fill = "none") +
labs(x = "Vanuatu: children") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_grid(#plot_us_ad_4,
plot_gh_ad_4, plot_gh_ch_4, plot_th_ad_4,
plot_th_ch_4, plot_vt_ad_4, plot_vt_ch_4,
ncol = 2, labels = c("A", "B", "C", "D", "E", "F", "G"))

Counts
paste("US adults:", nrow(d_us_ad_pilot))
[1] "US adults: 131"
paste("GH adults:", nrow(d_gh_ad))
[1] "GH adults: 150"
paste("GH children:", nrow(d_gh_ch))
[1] "GH children: 149"
paste("TH adults:", nrow(d_th_ad))
[1] "TH adults: 150"
paste("TH children:", nrow(d_th_ch))
[1] "TH children: 152"
paste("VT adults:", nrow(d_vt_ad))
[1] "VT adults: 164"
paste("VT children:", nrow(d_vt_ch))
[1] "VT children: 169"
paste("Non-US:", sum(nrow(d_gh_ad), nrow(d_gh_ch),
nrow(d_th_ad), nrow(d_th_ch),
nrow(d_vt_ad), nrow(d_vt_ch)))
[1] "Non-US: 934"
LS0tCnRpdGxlOiAiU1JDRCAyMDE5IFN5bXBvc2l1bTogUmVsaWdpb3VzICYgbWV0YXBoeXNpY2FsIGNvbmNlcHRzIChTcmluaXZhc2FuKSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC42NykKYGBgCgpgYGB7cn0KIyBsb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsYW5nY29nKSAjIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2xhbmdjb2cvbGFuZ2NvZy1wYWNrYWdlCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobG1lNCkKbGlicmFyeShjb3dwbG90KQoKIyBzZXQgdGhlbWUgZm9yIGdncGxvdHMKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpzb3VyY2UoIi4vc2NyaXB0cy9tYXhfZmFjdG9yc19lZmEuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Bsb3RfZnVuX2JlZXRsZXMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3JldGVuX2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvY2xlYW5fZnVuLlIiKQpgYGAKCiMgRGF0YSBwcmVwYXJhdGlvbgoKYGBge3IsIGluY2x1ZGUgPSBGfQpxdWVzdGlvbl9rZXkgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREVWRUxPUE1FTlRBTCBUQVNLUy9iZWV0bGVzOmRpbWtpZDpmYWN0b3JzL2Rlc2lnbi9iZWV0bGVzIGNiLmNzdiIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGLCB3YXJuaW5nID0gRkFMU0V9CiMgVVMgYWR1bHRzIFBJTE9UCmRfdXNfYWRfcGlsb3RfcmF3IDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvVGVtcGxldG9uIEdyYW50L0RFVkVMT1BNRU5UQUwgVEFTS1MvYmVldGxlczpkaW1raWQ6ZmFjdG9ycy9hbmFseXNpcy9fVVMgcGlsb3QvYmVldGxlc19waWxvdDJfdGlkeS5jc3YiKQpkX3VzX2FkX3BpbG90IDwtIGRfdXNfYWRfcGlsb3RfcmF3ICU+JQogIGZpbHRlcihzY2FsZSA9PSAiYmVldGxlcyIpICU+JQogIGRpc3RpbmN0KHN1YmlkLCBjaGFyYWN0ZXIsIHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgZmlsdGVyKCFxdWVzdGlvbiAlaW4lIGMoImJsZWVkIiwgIm1pbmQiLCAic291bCIpKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSByZWNvZGUocXVlc3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRfc3VidHJhY3QiID0gImFkZCBhbmQgc3VidHJhY3QgbnVtYmVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmdyeSIgPSAiZ2V0IGFuZ3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiYmxlZWQiID0gImJsZWVkIHdoZW4gdGhleSB0b3VjaCBzb21ldGhpbmcgc2hhcnAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvb3NlIiA9ICJjaG9vc2Ugd2hhdCB0byBkbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWd1cmVfb3V0IiA9ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpbHR5IiA9ICJmZWVsIGd1aWx0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXBweSIgPSAiZmVlbCBoYXBweSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFyIiA9ICJoZWFyIHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJodW5ncnkiID0gImdldCBodW5ncnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaHVydF9mZWVsaW5ncyIgPSAiZ2V0IGh1cnQgZmVlbGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibG92ZSIgPSAiZmVlbCBsb3ZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAibWluZCIgPSAiaGF2ZSBtaW5kcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWluIiA9ICJmZWVsIHBhaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicHJheSIgPSAicHJheSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvdWQiID0gImZlZWwgcHJvdWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtZW1iZXIiID0gInJlbWVtYmVyIHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWQiID0gImZlZWwgc2FkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjYXJlZCIgPSAiZmVlbCBzY2FyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc2VfZmFyIiA9ICJzZW5zZSB3aGVuIHRoaW5ncyBhcmUgZmFyIGF3YXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc2VfdGVtcCIgPSAic2Vuc2UgdGVtcGVyYXR1cmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoeSIgPSAiZmVlbCBzaHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2ljayIgPSAiZmVlbCBzaWNrLCBsaWtlIHdoZW4geW91IGZlZWwgbGlrZSB5b3UgbWlnaHQgdm9taXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic21lbGwiID0gInNtZWxsIHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInNvdWwiID0gImhhdmUgc291bHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpbmsiID0gInRoaW5rIGFib3V0IHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXJlZCIgPSAiZmVlbCB0aXJlZCIpKSAlPiUKICBzcHJlYWQocXVlc3Rpb24sIHJlc3BvbnNlKSAlPiUKICBzZWxlY3QoLXN1YmlkKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBwYXN0ZSgidXNfYWQiLAogICAgICAgICAgICAgICAgICAgICAgIDEwMDAxOigxMDAwMCtsZW5ndGgobGV2ZWxzKGZhY3RvcihkX3VzX2FkX3BpbG90X3JhdyRzdWJpZCkpKSksCiAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyLAogICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICJfIikpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKSAlPiUKICBzZWxlY3QoLWBhZGQgYW5kIHN1YnRyYWN0IG51bWJlcnNgLCAtY2hhcmFjdGVyKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRiwgd2FybmluZyA9IEZBTFNFfQojIyBVUyBhZHVsdHM6IE5PVCBZRVQgUlVOCiMjIFVTIGNoaWxkcmVuOiBOT1QgWUVUIFJVTgoKIyMgR0ggYWR1bHRzOiBOT1QgWUVUIFJVTgpkX2doX2FkIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfR0hBTkFfMjAxOC9iZWV0bGVzX2doYW5hX2FkdWx0c190aWR5XzIwMTgtMDgtMTIuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAiZ2giLCBhZ2UgPSAiYWQiKQojIyBHSCBjaGlsZHJlbgpkX2doX2NoIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfR0hBTkEvYmVldGxlc19naGFuYV90aWR5XzIwMTctMDctMTIuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAiZ2giLCBhZ2UgPSAiY2giKQpkX2doX2NoX2ZhbnRlIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfR0hBTkFfMjAxOC9iZWV0bGVzX2doYW5hX2ZhbnRlX2NoaWxkcmVuX3RpZHlfMjAxOC0wNy0xOS5jc3YiKVstMV0gJT4lIAogIHJlbmFtZShzdWJudW0gPSBzdWJpZCkgJT4lIAogIGZpbHRlcihncmVwbCgiZmFudGUiLCB0b2xvd2VyKGxhbmd1YWdlX2hvbWUpKSB8IGdyZXBsKCJ0d2kiLCB0b2xvd2VyKGxhbmd1YWdlX2hvbWUpKSkgJT4lCiAgY2xlYW5fZnVuKGtleSA9IHF1ZXN0aW9uX2tleSwgZXhfYWRkc3ViID0gVCwgc2l0ZSA9ICJnaCIsIGFnZSA9ICJjaCIpCgojIyBDSCBhZHVsdHM6IE5PVCBZRVQgUlVOCiMjIENIIGNoaWxkcmVuOiBOT1QgWUVUIFJVTgoKIyMgVEggYWR1bHRzCmRfdGhfYWQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9EZXNrdG9wL1RFTVAvVEVNUF9USEFJTEFORC9iZWV0bGVzX3RoYWlsYW5kX2FkdWx0c190aWR5XzIwMTgtMDUtMDkuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAidGgiLCBhZ2UgPSAiYWQiKQojIyBUSCBjaGlsZHJlbgpkX3RoX2NoIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfVEhBSUxBTkQvYmVldGxlc190aGFpbGFuZF9jaGlsZHJlbl90aWR5XzIwMTgtMDUtMDkuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAidGgiLCBhZ2UgPSAiY2giKQoKIyMgVlQgYWR1bHRzCmRfdnRfYWQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9EZXNrdG9wL1RFTVAvVEVNUF9WQU5VQVRVL2JlZXRsZXNfdmFudWF0dV9hZHVsdHNfdGlkeV8yMDE4LTA1LTA5LmNzdiIpICU+JSBjbGVhbl9mdW4oa2V5ID0gcXVlc3Rpb25fa2V5LCBleF9hZGRzdWIgPSBULCBzaXRlID0gInZ0IiwgYWdlID0gImFkIikKIyMgVlQgY2hpbGRyZW4KZF92dF9jaCA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0Rlc2t0b3AvVEVNUC9URU1QX1ZBTlVBVFUvYmVldGxlc192YW51YXR1X2NoaWxkcmVuX3RpZHlfMjAxOC0wNS0wOS5jc3YiKSAlPiUgY2xlYW5fZnVuKGtleSA9IHF1ZXN0aW9uX2tleSwgZXhfYWRkc3ViID0gVCwgc2l0ZSA9ICJ2dCIsIGFnZSA9ICJjaCIpCmBgYAoKYGBge3J9CmRfYWxsIDwtICMgZF91c19hZF9waWxvdCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIGRfZ2hfYWQgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKICBmdWxsX2pvaW4oZF9naF9jaCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBmdWxsX2pvaW4oZF90aF9hZCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBmdWxsX2pvaW4oZF90aF9jaCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBmdWxsX2pvaW4oZF92dF9hZCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBmdWxsX2pvaW4oZF92dF9jaCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKYGBgCgojIFNoYXJlZCBjb25jZXB0dWFsIHN0cnVjdHVyZQoKUG9vbGluZyBhbGwgcGFydGljaXBhbnRzIGZyb20gYWxsIHNpdGVzIHRvZ2V0aGVyIGludG8gYSBjb21tb24gZmFjdG9yIHN0cnVjdHVyZS4KCiMjIFBhcmFsbGVsIGFuYWx5c2lzCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fYWxsX1BBIDwtIGZhLnBhcmFsbGVsKGRfYWxsLCBwbG90ID0gRik7IHJldGVuX2FsbF9QQQpyZXRlbl9hbGxfcGFyIDwtIHJldGVuX2FsbF9QQSRuZmFjdApgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV9hbGxfcGFyIDwtIGZhKGRfYWxsLCBuZmFjdG9ycyA9IHJldGVuX2FsbF9wYXIsIHJvdGF0ZSA9ICJvYmxpbWluIiwKICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAyfQpoZWF0bWFwX2Z1bihlZmFfYWxsX3BhcikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byB3aGljaCB0YXJnZXRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjh9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfcGFyLCB0YXJnZXQgPSAiYWxsIikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDEuNX0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9wYXIsIHRhcmdldCA9IGMoImdob3N0cyIsICJHb2QiLCAiY2hpbGRyZW4iKSkgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDF9Cml0ZW1zcGxvdF9mdW4oZWZhX2FsbF9wYXIsIHRhcmdldCA9IGMoImdob3N0cyIsICJHb2QiLCAiY2hpbGRyZW4iKSkgKwogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKQpgYGAKCgojIyBNaW5pbWl6aW5nIEJJQwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuX2FsbF9CSUMgPC0gVlNTKGRfYWxsLCBwbG90ID0gRik7IHJldGVuX2FsbF9CSUMKcmV0ZW5fYWxsX2JpYyA8LSBkYXRhLmZyYW1lKHJldGVuX2FsbF9CSUMkdnNzLnN0YXRzICU+JSByb3duYW1lc190b19jb2x1bW4oIm5mYWN0IikgJT4lIHRvcF9uKC0xLCBCSUMpKSRuZmFjdCAlPiUgYXMubnVtZXJpYygpCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhX2FsbF9iaWMgPC0gZmEoZF9hbGwsIG5mYWN0b3JzID0gcmV0ZW5fYWxsX2JpYywgcm90YXRlID0gIm9ibGltaW4iLAogICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNC41fQpoZWF0bWFwX2Z1bihlZmFfYWxsX2JpYywgCiAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGMoIkNPR05JVElWRSIsICJCT0RJTFkiLCAiU09DSUFMLUVNT1RJT05BTCIsICJvdGhlciIpKSArIAogICMgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCiAgbGFicyh4ID0gIkZpZ3VyZSAxOiBTaGFyZWQgY29uY2VwdHVhbCBzdHJ1Y3R1cmUiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKCJmYWN0b3IgbG9hZGluZyIsIGJhcmhlaWdodCA9IDE1KSkKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byB3aGljaCB0YXJnZXRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX2JpYywgdGFyZ2V0ID0gImFsbCIsIGhpZ2hsaWdodCA9ICJzdXBlcm5hdHVyYWwiLAogICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJDT0dOSVRJVkUiLCAiQk9ESUxZIiwgIlNPQ0lBTC1FTU9USU9OQUwiLCAib3RoZXIiKSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGMocmVwKCJibGFjayIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIiM5ODRlYTMiLCAyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGMocmVwKCJwbGFpbiIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYm9sZCIsIDIpKSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZTQxYTFjIiwgIiM0ZGFmNGEiLCAiIzM3N2ViOCIsICJncmF5IikpICsKICAjIGxhYnModGl0bGUgPSAiTWluaW1pemluZyBCSUMiKQogIGxhYnModGl0bGUgPSAiRmlndXJlIDI6IEZhY3RvciBzY29yZXMiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLjUsIGZpZy5hc3AgPSAxfQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX2JpYywgdGFyZ2V0ID0gYygiZ2hvc3RzIiwgIkdvZCIsICJjaGlsZHJlbiIpKSArIAogICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2U0MWExYyIsICIjNGRhZjRhIiwgIiMzNzdlYjgiKSkgKwogIGxhYnModGl0bGUgPSAiTWluaW1pemluZyBCSUMiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KaXRlbXNwbG90X2Z1bihlZmFfYWxsX2JpYywgdGFyZ2V0ID0gYygiZ2hvc3RzIiwgIkdvZCIsICJjaGlsZHJlbiIpKSArIAogIGxhYnModGl0bGUgPSAiTWluaW1pemluZyBCSUMiKQpgYGAKCgoKIyMgUHJlc2V0IGNyaXRlcmlhCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fYWxsX2sgPC0gcmV0ZW5fZnVuKGRfYWxsLCByb3RfdHlwZSA9ICJvYmxpbWluIik7IHJldGVuX2FsbF9rCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhX2FsbF9rIDwtIGZhKGRfYWxsLCBuZmFjdG9ycyA9IHJldGVuX2FsbF9rLCByb3RhdGUgPSAib2JsaW1pbiIsCiAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMn0KaGVhdG1hcF9mdW4oZWZhX2FsbF9rKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGNyaXRlcmlhIChXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIHdoaWNoIHRhcmdldHM/CgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuOH0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9rLCB0YXJnZXQgPSAiYWxsIikgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBjcml0ZXJpYSAoV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDEuNX0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9rLCB0YXJnZXQgPSBjKCJnaG9zdHMiLCAiR29kIiwgImNoaWxkcmVuIikpICsgCiAgbGFicyh0aXRsZSA9ICJQcmVzZXQgY3JpdGVyaWEgKFdlaXNtYW4gZXQgYWwuLCAyMDE3KSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfaywgdGFyZ2V0ID0gYygiZ2hvc3RzIiwgIkdvZCIsICJjaGlsZHJlbiIpKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGNyaXRlcmlhIChXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCgojIyAzIGZhY3RvcnMKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV9hbGxfMyA8LSBmYShkX2FsbCwgbmZhY3RvcnMgPSAzLCByb3RhdGUgPSAib2JsaW1pbiIsCiAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuNn0KaGVhdG1hcF9mdW4oZWZhX2FsbF8zLCAKICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gYygiQ09HTklUSVZFIiwgIkJPRElMWSIsICJTT0NJQUwtRU1PVElPTkFMIikpICsgCiAgbGFicyh4ID0gIlNoYXJlZCBjb25jcGV0dWFsIHN0cnVjdHVyZSIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSkKICAjIGxhYnModGl0bGUgPSAiUHJlc2V0IGNyaXRlcmlhIChXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIHdoaWNoIHRhcmdldHM/CgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuNjd9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfMywgdGFyZ2V0ID0gImFsbCIsIGhpZ2hsaWdodCA9ICJzdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJDT0dOSVRJVkUiLCAiQk9ESUxZIiwgIlNPQ0lBTC1FTU9USU9OQUwiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNlNDFhMWMiLCAiIzRkYWY0YSIsICIjMzc3ZWI4IikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGMocmVwKCJibGFjayIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIiM5ODRlYTMiLCAyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGMocmVwKCJwbGFpbiIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYm9sZCIsIDIpKSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAxLjV9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfMywgdGFyZ2V0ID0gYygiZ2hvc3RzIiwgIkdvZCIsICJjaGlsZHJlbiIpKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGNyaXRlcmlhIChXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KaXRlbXNwbG90X2Z1bihlZmFfYWxsXzMsIHRhcmdldCA9IGMoImdob3N0cyIsICJHb2QiLCAiY2hpbGRyZW4iKSkgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBjcml0ZXJpYSAoV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgoKIyBDb21wYXJpbmcgY29uY2VwdHVhbCBzdHJ1Y3R1cmVzCgpXZSdsbCBleHRyYWN0IDQgZmFjdG9ycyBmcm9tIGFsbCBzYW1wbGVzLCB0byBrZWVwIHRoaW5ncyBzaW1wbGUuCgpgYGB7cn0KZWZhX3VzX2FkXzQgPC0gZmEoZF91c19hZF9waWxvdCwgbmZhY3RvcnMgPSA0LCByb3RhdGUgPSAib2JsaW1pbiIpCmVmYV9naF9hZF80IDwtIGZhKGRfZ2hfYWQsIG5mYWN0b3JzID0gNCwgcm90YXRlID0gIm9ibGltaW4iKQplZmFfZ2hfY2hfNCA8LSBmYShkX2doX2NoLCBuZmFjdG9ycyA9IDQsIHJvdGF0ZSA9ICJvYmxpbWluIikKZWZhX3RoX2FkXzQgPC0gZmEoZF90aF9hZCwgbmZhY3RvcnMgPSA0LCByb3RhdGUgPSAib2JsaW1pbiIpCmVmYV90aF9jaF80IDwtIGZhKGRfdGhfY2gsIG5mYWN0b3JzID0gNCwgcm90YXRlID0gIm9ibGltaW4iKQplZmFfdnRfYWRfNCA8LSBmYShkX3Z0X2FkLCBuZmFjdG9ycyA9IDQsIHJvdGF0ZSA9ICJvYmxpbWluIikKZWZhX3Z0X2NoXzQgPC0gZmEoZF92dF9jaCwgbmZhY3RvcnMgPSA0LCByb3RhdGUgPSAib2JsaW1pbiIpCmBgYAoKYGBge3J9CnBsb3RfdXNfYWRfNCA8LSBoZWF0bWFwX2Z1bihlZmFfdXNfYWRfNCkgKyAKICBndWlkZXMoZmlsbCA9ICJub25lIikgKyAKICBsYWJzKHggPSAiVVM6IGFkdWx0cyIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSkKCnBsb3RfZ2hfYWRfNCA8LSBoZWF0bWFwX2Z1bihlZmFfZ2hfYWRfNCkgKyAKICBndWlkZXMoZmlsbCA9ICJub25lIikgKyAKICBsYWJzKHggPSAiR2hhbmE6IGFkdWx0cyIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSkKCnBsb3RfZ2hfY2hfNCA8LSBoZWF0bWFwX2Z1bihlZmFfZ2hfY2hfNCkgKyAKICBndWlkZXMoZmlsbCA9ICJub25lIikgKyAKICBsYWJzKHggPSAiR2hhbmE6IGNoaWxkcmVuIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApKQoKcGxvdF90aF9hZF80IDwtIGhlYXRtYXBfZnVuKGVmYV90aF9hZF80KSArIAogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArIAogIGxhYnMoeCA9ICJUaGFpbGFuZDogYWR1bHRzIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApKQoKcGxvdF90aF9jaF80IDwtIGhlYXRtYXBfZnVuKGVmYV90aF9jaF80KSArIAogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArIAogIGxhYnMoeCA9ICJUaGFpbGFuZDogY2hpbGRyZW4iKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkpCgpwbG90X3Z0X2FkXzQgPC0gaGVhdG1hcF9mdW4oZWZhX3Z0X2FkXzQpICsgCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpICsgCiAgbGFicyh4ID0gIlZhbnVhdHU6IGFkdWx0cyIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSkKCnBsb3RfdnRfY2hfNCA8LSBoZWF0bWFwX2Z1bihlZmFfdnRfY2hfNCkgKyAKICBndWlkZXMoZmlsbCA9ICJub25lIikgKyAKICBsYWJzKHggPSAiVmFudWF0dTogY2hpbGRyZW4iKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkpCmBgYAoKYGBge3IsIGZpZy5hc3AgPSAxLjV9CnBsb3RfZ3JpZCgjcGxvdF91c19hZF80LCAKICAgICAgICAgIHBsb3RfZ2hfYWRfNCwgcGxvdF9naF9jaF80LCBwbG90X3RoX2FkXzQsIAogICAgICAgICAgcGxvdF90aF9jaF80LCBwbG90X3Z0X2FkXzQsIHBsb3RfdnRfY2hfNCwgCiAgICAgICAgICBuY29sID0gMiwgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIpKQpgYGAKCiMgQ291bnRzCgpgYGB7cn0KcGFzdGUoIlVTIGFkdWx0czoiLCBucm93KGRfdXNfYWRfcGlsb3QpKQpwYXN0ZSgiR0ggYWR1bHRzOiIsIG5yb3coZF9naF9hZCkpCnBhc3RlKCJHSCBjaGlsZHJlbjoiLCBucm93KGRfZ2hfY2gpKQpwYXN0ZSgiVEggYWR1bHRzOiIsIG5yb3coZF90aF9hZCkpCnBhc3RlKCJUSCBjaGlsZHJlbjoiLCBucm93KGRfdGhfY2gpKQpwYXN0ZSgiVlQgYWR1bHRzOiIsIG5yb3coZF92dF9hZCkpCnBhc3RlKCJWVCBjaGlsZHJlbjoiLCBucm93KGRfdnRfY2gpKQoKcGFzdGUoIk5vbi1VUzoiLCBzdW0obnJvdyhkX2doX2FkKSwgbnJvdyhkX2doX2NoKSwKICAgICAgICAgICAgICAgICAgICAgbnJvdyhkX3RoX2FkKSwgbnJvdyhkX3RoX2NoKSwKICAgICAgICAgICAgICAgICAgICAgbnJvdyhkX3Z0X2FkKSwgbnJvdyhkX3Z0X2NoKSkpCmBgYAoK